package com.xqq.utils;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.po.LikeTable;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.util.Collections;

/**
 * @author kyle
 * @version 1.0
 * @description 描述
 * @date 2023/10/15
 */
public class DAOGenerator {

    public static void main(String[] args) {
//        MYSQL_HOST: '172.16.1.20'
//        MYSQL_PORT: 10015 # 10138(原来的)
//                MYSQL_ROOT_PASSWORD: '657ffee4'
//        String host = "172.16.1.20";
//        String port = "10015";
//        String schema = "weihe_miandian";
//        String username = "root";
//        String password = "657ffee4";
//        String host = "127.0.0.1";
//        String port = "3306";
//        String schema = "weihe_miandian";
//        String username = "root";
//        String password = "123456";
//        String author = "xqq";
//        String baseOutputDir = "F:/Code/Code_xwsk/huanyu-alpha-event/huanyu-alpha-event-server/src/main";
//        String outputDirJava = baseOutputDir + "/java";
//        String parentPackageName = "com.csnd.huanyu.alpha.event.server";
//        String tablePrefix = "country";


        //==========================huanyu-alpha-event==============================//
//        String host = "127.0.0.1";
//        String port = "3306";
//        String schema = "weihe";
//        String username = "root";
//        String password = "123456";
//        String author = "xqq";
//        String baseOutputDir = "F:/Code/Code_xwsk/huanyu-alpha-event/huanyu-alpha-event-server/src/main";
//        String outputDirJava = baseOutputDir + "/java";
//        String parentPackageName = "com.csnd.huanyu.alpha.event.server";
//        String tablePrefix = "radar_track_data";
        //========================================================//
        String host = "127.0.0.1";
        String port = "3306";
        String schema = "weihe_miandian";
        String username = "root";
        String password = "123456";
        String author = "xqq";
        String baseOutputDir = "F:/Code/Code_xwsk/global-security/global-security-server/src/main";
        String outputDirJava = baseOutputDir + "/java";
        String parentPackageName = "com.csnd.global.security.server";
        String tablePrefix = "ngiam";


        FastAutoGenerator.create("jdbc:mysql://" + host + ":" + port + "/" + schema + "?serverTimezone=Asia/Shanghai" +
                        "&useUnicode=true&characterEncoding=utf8", username, password)
                .globalConfig(builder -> {
                    builder.author(author) // 设置作者
                            .fileOverride() // 覆盖已生成文件
                            .outputDir(outputDirJava);
                    // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent(parentPackageName) // 设置父包名
                            //.moduleName("dao") // 设置父包模块名
                            .entity("entity")
                            .service("dao")
                            .serviceImpl("dao.impl")
                            .mapper("mapper")
                            .xml("mapper.xml")
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml,
                                    baseOutputDir +
                                            "/resources/mapper")); // 设置mapperXml

                    // 生成路径
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板

                .strategyConfig(builder -> {
                    builder.likeTable(new LikeTable(tablePrefix));// 匹配以msg开头的表
//                            .addInclude("t_simple") // 设置需要生成的表名
//                            .addTablePrefix("t_", "c_"); // 设置过滤表前缀
                    builder.entityBuilder()
//                            .superClass(BaseEntity.class) // 设置父类
                            .disableSerialVersionUID()
//                            .enableChainModel() // 开启驼峰转连字符
                            .enableLombok()
                            .enableRemoveIsPrefix() //开启 Boolean 类型字段移除 is 前缀
                            .enableTableFieldAnnotation()// 开启生成实体时生成字段注解
//                            .versionColumnName("version")// 乐观锁字段名(数据库)
//                            .versionPropertyName("version")// 乐观锁属性名(实体)
                            //.logicDeleteColumnName("delete_flag")// 逻辑删除字段名(数据库)
                            //.logicDeletePropertyName("deleteFlag")// 逻辑删除属性名(实体)
                            .naming(NamingStrategy.underline_to_camel)// 数据库表映射到实体的命名策略
                            .columnNaming(NamingStrategy.underline_to_camel)// 数据库表字段映射到实体的命名策略
                            .addTableFills(new Column("create_time", FieldFill.INSERT),// 这些都是通用字段
                                    new Column("creator", FieldFill.INSERT),
                                    new Column("delete_flag", FieldFill.INSERT),
                                    new Column("modify_time", FieldFill.INSERT_UPDATE),
                                    new Column("modifier", FieldFill.INSERT_UPDATE)
                            )
                            .idType(IdType.AUTO)
                            .formatFileName("%sDO")
                            .build();
                    builder.serviceBuilder().formatServiceFileName("%sDAO")
                            .formatServiceImplFileName("%sDAOImpl")
                            .build();
                    builder.mapperBuilder().formatMapperFileName("%sMapper")
                            .formatXmlFileName("%sXml")
                            .build();
                })
                .execute();
        System.out.println("================================");

        FastAutoGenerator.create("jdbc:mysql://" + host + ":" + port + "/" + schema + "?serverTimezone=Asia/Shanghai" +
                        "&useUnicode=true&characterEncoding=utf8", username, password)
                .globalConfig(builder -> {
                    builder.author(author) // 设置作者
                            .fileOverride() // 覆盖已生成文件
                            .outputDir(outputDirJava);
                    // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent(parentPackageName) // 设置父包名
                            .service("service")//文件路径
                            .serviceImpl("service.impl");
                })
                .templateEngine(new FreemarkerTemplateEngine())
                .templateConfig(builder -> {
                    // 指定自定义模板路径
                    builder.service("my-templates/operateService.java") // 自定义服务接口模板
                            .serviceImpl("my-templates/operateServiceImpl.java"); // 自定义服务实现模板
                })
                .strategyConfig(builder -> {
                    builder.likeTable(new LikeTable(tablePrefix));// 匹配以msg开头的表
//                            .addInclude("t_simple") // 设置需要生成的表名
//                            .addTablePrefix("t_", "c_"); // 设置过滤表前缀
                    builder.entityBuilder()
//                            .superClass(BaseEntity.class) // 设置父类
                            .disableSerialVersionUID()
//                            .enableChainModel() // 开启驼峰转连字符
                            .enableLombok()
                            .enableRemoveIsPrefix() //开启 Boolean 类型字段移除 is 前缀
                            .enableTableFieldAnnotation()// 开启生成实体时生成字段注解
//                            .versionColumnName("version")// 乐观锁字段名(数据库)
//                            .versionPropertyName("version")// 乐观锁属性名(实体)
                            //.logicDeleteColumnName("delete_flag")// 逻辑删除字段名(数据库)
                            //.logicDeletePropertyName("deleteFlag")// 逻辑删除属性名(实体)
                            .naming(NamingStrategy.underline_to_camel)// 数据库表映射到实体的命名策略
                            .columnNaming(NamingStrategy.underline_to_camel)// 数据库表字段映射到实体的命名策略
                            .addTableFills(new Column("create_time", FieldFill.INSERT),// 这些都是通用字段
                                    new Column("creator", FieldFill.INSERT),
                                    new Column("delete_flag", FieldFill.INSERT),
                                    new Column("modify_time", FieldFill.INSERT_UPDATE),
                                    new Column("modifier", FieldFill.INSERT_UPDATE)
                            )
                            .idType(IdType.AUTO)
                            .formatFileName("%sDO")
                            .build();
                    builder.serviceBuilder()
                            .formatServiceFileName("%sOperateService")
                            .formatServiceImplFileName("%sOperateServiceImpl")
                            .build();
                })
                .execute();
    }
}
//    public static void main(String[] args) {
////        MYSQL_HOST: '172.16.1.20'
////        MYSQL_PORT: 10015 # 10138(原来的)
////                MYSQL_ROOT_PASSWORD: '657ffee4'
////        String host = "172.16.1.20";
////        String port = "10015";
////        String schema = "weihe_miandian";
////        String username = "root";
////        String password = "657ffee4";
//        String host = "127.0.0.1";
//        String port = "3306";
//        String schema = "weihe_miandian";
//        String username = "root";
//        String password = "123456";
//        String author = "xqq";
//        String baseOutputDir = "F:\\Code\\Code_xwsk\\huanyu-alpha-event\\src\\main";
//        String outputDirJava = baseOutputDir+"\\java";
//        String parentPackageName = "com.csnd.huanyu.alpha.event";
//        String tablePrefix = "place";
//
//        FastAutoGenerator.create("jdbc:mysql://"+host+":"+port+"/"+schema+"?serverTimezone=Asia/Shanghai" +
//                        "&useUnicode=true&characterEncoding=utf8", username, password)
//                .globalConfig(builder -> {
//                    builder.author(author) // 设置作者
//                            .fileOverride() // 覆盖已生成文件
//                            .outputDir(outputDirJava);
//                    // 指定输出目录
//                })
//                .packageConfig(builder -> {
//                    builder.parent(parentPackageName) // 设置父包名
//                            //.moduleName("dao") // 设置父包模块名
//                            .entity("entity")
//                            .service("dao")
//                            .serviceImpl("dao.impl")
//                            .mapper("mapper")
//                            .xml("mapper.xml")
//                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml,
//                                    baseOutputDir+
//                                            "/resources/mapper")); // 设置mapperXml
//                    // 生成路径
//                })
//                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
//
//                .strategyConfig(builder->{
//                    builder.likeTable(new LikeTable(tablePrefix));// 匹配以msg开头的表
////                            .addInclude("t_simple") // 设置需要生成的表名
////                            .addTablePrefix("t_", "c_"); // 设置过滤表前缀
//                    builder.entityBuilder()
////                            .superClass(BaseEntity.class) // 设置父类
//                            .disableSerialVersionUID()
////                            .enableChainModel() // 开启驼峰转连字符
//                            .enableLombok()
//                            .enableRemoveIsPrefix() //开启 Boolean 类型字段移除 is 前缀
//                            .enableTableFieldAnnotation()// 开启生成实体时生成字段注解
////                            .versionColumnName("version")// 乐观锁字段名(数据库)
////                            .versionPropertyName("version")// 乐观锁属性名(实体)
//                            //.logicDeleteColumnName("delete_flag")// 逻辑删除字段名(数据库)
//                            //.logicDeletePropertyName("deleteFlag")// 逻辑删除属性名(实体)
//                            .naming(NamingStrategy.underline_to_camel)// 数据库表映射到实体的命名策略
//                            .columnNaming(NamingStrategy.underline_to_camel)// 数据库表字段映射到实体的命名策略
//                            .addTableFills(new Column("create_time", FieldFill.INSERT),// 这些都是通用字段
//                                    new Column("creator", FieldFill.INSERT),
//                                    new Column("delete_flag", FieldFill.INSERT),
//                                    new Column("modify_time", FieldFill.INSERT_UPDATE),
//                                    new Column("modifier", FieldFill.INSERT_UPDATE)
//                            )
//                            .idType(IdType.AUTO)
//                            .formatFileName("%sDO")
//                            .build();
//                    builder.serviceBuilder().formatServiceFileName("%sDAO")
//                            .formatServiceImplFileName("%sDAOImpl")
//                            .build();
//                    builder.mapperBuilder().formatMapperFileName("%sMapper")
//                            .formatXmlFileName("%sXml")
//                            .build();
//                })
//                .execute();
//    }
//}
